package ar.edu.caece.compiler.grammars.sample2.factories;

import ar.edu.caece.compiler.grammars.sample2.grammar.F1;
import ar.edu.caece.compiler.grammars.sample2.tokens.SampleGrammarSymbol;
import ar.edu.caece.compiler.grammars.sample2.tokens.NumToken;
import ar.edu.caece.compiler.grammars.sample2.tokens.SampleToken;
import ar.edu.caece.compiler.grammars.sample2.tokens.TokenVisitorInterface;
import ar.edu.caece.compiler.model.LexicalAnalyzer;

//F1 -> num
public class F1Factory extends AbstractTokenVisitorFactory{

	private static F1Factory INSTANCE;
	
	public F1Factory(LexicalAnalyzer analizadorLexico) {
		super(analizadorLexico);
		// TODO Auto-generated constructor stub
	}
	
	public F1Factory(){
		
	}

	@Override
	public TokenVisitorInterface makeChainedVisitor(
			final TokenVisitorInterface siguiente) {
		return new NumToken.NumChainVisitor(siguiente) {

			
			@Override
			public SampleGrammarSymbol numCase(NumToken llamador, SampleGrammarSymbol param) {
				System.out.println("Generando nuevo F1");
				return new F1(llamador);
			}
		};
	}

	@Override
	public TokenVisitorInterface makeVisitor() {
		// TODO Auto-generated method stub
		return new NumToken.NumTokenVisitor() {
			
			@Override
			public SampleGrammarSymbol defaultCase(SampleToken llamador, SampleGrammarSymbol param)
					throws Exception {
				throw new Exception("Token equivocado!");
			}
			
			@Override
			public SampleGrammarSymbol numCase(NumToken llamador, SampleGrammarSymbol param) {
				System.out.println("Generando nuevo F1");
				return new F1(llamador);
			}
		};			
	}

	public static F1Factory getInstance() {
		if(INSTANCE==null) INSTANCE = new F1Factory();
		return INSTANCE;
	}
}
